package br.com.conhecimento.core.util;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author Walter Fontes
 *
 * Classe para auxiliar o tratamento de campos do tipo Email
 */
public class ValidacaoUtil {
	public static final boolean emailValido(String email) {
		email = email.replaceAll("%40", "@");
		Pattern p = Pattern.compile(".+@.+\\..+");  
		Matcher m = p.matcher(email);

		return m.matches();
	}
	
	public static boolean validaCpfCnpj(String xDoc){
		return validaCpf(xDoc) || validaCnpj(xDoc);
	}
	
	public static boolean validaCpf(String xCPF){

		try {

			if (xCPF == null) return false;

			xCPF = String.valueOf(CNPJCPFUtil.retiraCaracteresAlpha(xCPF));
			while (xCPF.length() < 11) {
				xCPF = "0" + xCPF;
			}

			final Pattern p = Pattern.compile("9999999(\\d{2})?(\\d{2})?");
			final Matcher m = p.matcher(xCPF);
			if (m.matches()) {
				return true;
			}

			if ("00000000000".equals(xCPF) || /*"11111111111".equals(xCPF) || "22222222222".equals(xCPF) ||*/ "33333333333".equals(xCPF) ||
				"44444444444".equals(xCPF) || "55555555555".equals(xCPF) || "66666666666".equals(xCPF) || "77777777777".equals(xCPF) ||
				"88888888888".equals(xCPF) || "99999999999".equals(xCPF) || "12345678909".equals(xCPF)) {
				return false;
			}

			//Testa se o CPF é válido ou não
			int d1,d4,xx,nCount,resto,digito1,digito2;
			String Check;
			String Separadores = "/-.";
			d1 = 0; d4 = 0; xx = 1;
			for (nCount = 0; nCount < xCPF.length() -2; nCount++){
				String s_aux = xCPF.substring(nCount, nCount+1);
				if (Separadores.indexOf(s_aux) == -1) {
					d1 = d1 + ( 11 - xx ) * Integer.valueOf (s_aux).intValue();
					d4 = d4 + ( 12 - xx ) * Integer.valueOf (s_aux).intValue();
					xx++;
				}
			}
			resto = (d1 % 11);

			if (resto < 2){
				digito1 = 0;
			}else{
				digito1 = 11 - resto;
			}

			d4 = d4 + 2 * digito1;
			resto = (d4 % 11);
			if (resto < 2){
				digito2 = 0;
			}else{
				digito2 = 11 - resto;
			}

			Check = String.valueOf(digito1) + String.valueOf(digito2);
			String s_aux2 = xCPF.substring (xCPF.length()-2, xCPF.length());
			if (s_aux2.compareTo (Check) != 0){
				return false;
			}
			return true;
		}catch (Exception e){
			return false;
		}
	}

	public static boolean validaCnpj(String xCNPJ){
		try{
			if(xCNPJ == null) return false;
			while( xCNPJ.length() < 14 ) {
				xCNPJ = "0" + xCNPJ;
			}
			//Testa se o CNPJ é válido ou não
			int d1,d4,xx,nCount,fator,resto,digito1,digito2;
			String Check, s_aux;
			String Separadores = "/-.";
			d1 = 0;
			d4 = 0;
			xx = 0;
			for (nCount = 0; nCount < xCNPJ.length()-2; nCount++){
				s_aux = xCNPJ.substring (nCount, nCount+1);
				if (Separadores.indexOf(s_aux) == -1){
					if (xx < 4){
						fator = 5 - xx;
					}else{
						fator = 13 - xx;
					}
					d1 = d1 + Integer.valueOf (s_aux).intValue() * fator;
					if (xx < 5){
						fator = 6 - xx;
					}else{
						fator = 14 - xx;
					}
					d4 += Integer.valueOf (s_aux).intValue() * fator;
					xx++;
				}
			}
			resto = (d1 % 11);
			if (resto < 2){
				digito1 = 0;
			}else{
				digito1 = 11 - resto;
			}
			d4 = d4 + 2 * digito1;
			resto = (d4 % 11);
			if (resto < 2){
				digito2 = 0;
			}else{
				digito2 = 11 - resto;
			}
			Check = String.valueOf(digito1) + String.valueOf(digito2);
			if (Check.compareTo(xCNPJ.substring(xCNPJ.length()-2, xCNPJ.length() ))!=0){
				return false;
			}
			return true;
		}catch (Exception e){
			return false;
		}
	}
}